Jackson লাইব্রেরি ডিফল্টভাবে Java Enum কে JSON-এ serialize এবং deserialize করতে পারে। তবে কখনো কখনো আপনাকে Enum-এর ডিফল্ট serialization বা deserialization কাস্টমাইজ করতে হতে পারে। Jackson Enum কাস্টমাইজ করার জন্য অনেক ফিচার সরবরাহ করে, যেমন @JsonValue, @JsonCreator, এবং কাস্টম serializers/deserializers।
ডিফল্ট Enum Serialization এবং Deserialization
ডিফল্টভাবে, Jackson Enum-এর name (যেমন, Enum.name()) serialize করে।
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
public class DefaultEnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Enum Serialization
Status status = Status.ACTIVE;
String json = mapper.writeValueAsString(status);
System.out.println("Serialized JSON: " + json);
// Enum Deserialization
Status deserializedStatus = mapper.readValue("\"ACTIVE\"", Status.class);
System.out.println("Deserialized Enum: " + deserializedStatus);
}
}
enum Status {
ACTIVE, INACTIVE, PENDING
}
আউটপুট:
Serialized JSON: "ACTIVE"
Deserialized Enum: ACTIVE
1. @JsonValue এর মাধ্যমে Enum Serialization কাস্টমাইজ করা
@JsonValue ব্যবহার করে Enum কে কাস্টম string, number বা অন্য ফরম্যাটে serialize করা যায়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonValue;
enum Status {
ACTIVE("Active Status"),
INACTIVE("Inactive Status"),
PENDING("Pending Status");
private final String displayName;
Status(String displayName) {
this.displayName = displayName;
}
@JsonValue
public String getDisplayName() {
return displayName;
}
}
public class JsonValueExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Serialization
Status status = Status.ACTIVE;
String json = mapper.writeValueAsString(status);
System.out.println("Serialized JSON: " + json);
}
}
আউটপুট:
Serialized JSON: "Active Status"
2. @JsonCreator এর মাধ্যমে Enum Deserialization কাস্টমাইজ করা
@JsonCreator ব্যবহার করে JSON থেকে Enum কে কাস্টমভাবে deserialize করা যায়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
enum Status {
ACTIVE("Active Status"),
INACTIVE("Inactive Status"),
PENDING("Pending Status");
private final String displayName;
Status(String displayName) {
this.displayName = displayName;
}
@JsonValue
public String getDisplayName() {
return displayName;
}
@JsonCreator
public static Status forValue(String value) {
for (Status status : values()) {
if (status.displayName.equalsIgnoreCase(value)) {
return status;
}
}
throw new IllegalArgumentException("Invalid Status: " + value);
}
}
public class JsonCreatorExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Deserialization
Status status = mapper.readValue("\"Active Status\"", Status.class);
System.out.println("Deserialized Enum: " + status);
}
}
আউটপুট:
Deserialized Enum: ACTIVE
3. Enum Serialization এবং Deserialization কাস্টম Serializer/Deserializer ব্যবহার করে
Jackson-এ কাস্টম Serializer এবং Deserializer তৈরি করে Enum কাস্টমাইজ করা যায়।
Serializer এবং Deserializer তৈরি:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
// Custom Serializer
class StatusSerializer extends JsonSerializer<Status> {
@Override
public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(status.getDisplayName().toUpperCase());
}
}
// Custom Deserializer
class StatusDeserializer extends JsonDeserializer<Status> {
@Override
public Status deserialize(com.fasterxml.jackson.core.JsonParser p, com.fasterxml.jackson.databind.DeserializationContext ctxt)
throws IOException {
String value = p.getValueAsString();
for (Status status : Status.values()) {
if (status.getDisplayName().equalsIgnoreCase(value)) {
return status;
}
}
throw new IllegalArgumentException("Invalid Status: " + value);
}
}
// Enum with Custom Serializer/Deserializer
@JsonSerialize(using = StatusSerializer.class)
@JsonDeserialize(using = StatusDeserializer.class)
enum Status {
ACTIVE("Active Status"),
INACTIVE("Inactive Status"),
PENDING("Pending Status");
private final String displayName;
Status(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
}
ব্যবহার:
public class CustomSerializerDeserializerExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Serialization
Status status = Status.ACTIVE;
String json = mapper.writeValueAsString(status);
System.out.println("Serialized JSON: " + json);
// Deserialization
Status deserializedStatus = mapper.readValue("\"ACTIVE STATUS\"", Status.class);
System.out.println("Deserialized Enum: " + deserializedStatus);
}
}
আউটপুট:
Serialized JSON: "ACTIVE STATUS"
Deserialized Enum: ACTIVE
4. JSON ফিল্ডের মাধ্যমে Enum Map করা
যদি JSON এ Enum ফিল্ড অন্য কোনো ফিল্ডের মান অনুসারে নির্ধারিত হয়, তাহলে এটি কাস্টমভাবে পরিচালনা করতে হয়।
উদাহরণ:
enum PaymentStatus {
SUCCESS, FAILURE, PENDING
}
class Payment {
private String transactionId;
private PaymentStatus status;
// Getters and Setters
public String getTransactionId() {
return transactionId;
}
public void setTransactionId(String transactionId) {
this.transactionId = transactionId;
}
public PaymentStatus getStatus() {
return status;
}
public void setStatus(PaymentStatus status) {
this.status = status;
}
}
public class PaymentExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// JSON to Object
String json = """
{
"transactionId": "TXN12345",
"status": "SUCCESS"
}
""";
Payment payment = mapper.readValue(json, Payment.class);
System.out.println("Payment Status: " + payment.getStatus());
}
}
আউটপুট:
Payment Status: SUCCESS
Jackson-এর মাধ্যমে Enum serialization এবং deserialization কাস্টমাইজ করতে:
@JsonValueএবং@JsonCreatorসাধারণত সহজ এবং কার্যকর।- কাস্টম Serializer/Deserializer জটিল কেসের জন্য প্রয়োজন।
- API-এর ভিন্ন ভিন্ন কনটেক্সটে Enum কাস্টমাইজ করার জন্য কাস্টমাইজেশন গুরুত্বপূর্ণ।
আপনার প্রয়োজনের উপর নির্ভর করে সঠিক পদ্ধতি নির্বাচন করুন।
Read more